/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/agvWorld/MethodSrc/pso_method.cpp
 * @Description  : 实现了粒子群优化算法PSO相关的类PSOMethod。 
 *                 PSOMethod类负责管理PSO实例的创建、配置、优化以及结果的获取和打印。 
 *                 包含的主要功能有：配置粒子、计算优化结果、打印当前最优解、获取最优值和位置、 
 *                 检查最优解的可行性。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 17:41:25
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/
#include <math.h>
#include <fstream>
#include <string> 
#include <iostream>
#include "pso_method.h"

///////////////////////////////////////////////////////////////////////////////
//   Implementation of class "PSOMethod".

PSOMethod::PSOMethod()
{
	Clear();
}

PSOMethod::PSOMethod(int num_particles, int num_variables, double* lower_bounds, 
                       double* upper_bounds, double* vmax, 
                       ObjectiveFunction objective_function, double lower_weight,
                       double upper_weight, int max_iteration, double c1, double c2, 
                       double threshold, const std::string& stopping_criteria, 
                       const std::string& pso_type) 
{
	Clear();
	pso_ = new PSO(num_particles, num_variables, lower_bounds, upper_bounds, vmax,
					objective_function, lower_weight, upper_weight, max_iteration, 
					c1, c2, threshold, stopping_criteria, pso_type);
}


PSOMethod::~PSOMethod() 
{
	if (pso_ != nullptr) {
		delete pso_;
		pso_ = nullptr;
	}
}

/**
 * @brief 配置粒子群优化算法中的粒子
 *
 * 该函数用于配置粒子群优化算法（PSO）中的粒子。如果粒子群优化器（pso_）不为空，则调用其ConfigureParticle方法
 * 配置指定标识符（identifier）的粒子，其位置（pos）和速度（vel）由参数指定。
 *
 * @param identifier 粒子的标识符
 * @param pos        粒子的位置数组
 * @param vel        粒子的速度数组
 */
void PSOMethod::Configure(int identifier, const double* pos, const double* vel) 
{
	if (pso_ != nullptr) {
		pso_->ConfigureParticle(identifier, pos, vel);
	}
}

/**
 * @brief 清空PSOMethod中的pso_指针
 *
 * 此函数将PSOMethod类中的pso_指针设置为nullptr，以释放其指向的内存。
 */
void PSOMethod::Clear() 
{
  	pso_ = nullptr;
}

/**
 * @brief 计算函数
 *
 * 如果成员变量 pso_ 不为空，则调用其 Optimize 函数进行优化，并返回结果。
 * 如果 pso_ 为空，则返回 -1。
 *
 * @return 优化结果，如果 pso_ 不为空则返回优化结果，否则返回 -1。
 */
int PSOMethod::Compute() 
{
	if (pso_ != nullptr) {
		return pso_->Optimize();
	}
	return -1;
}

/**
 * @brief 打印当前最优解
 *
 * 如果PSOMethod对象中包含有效的PSO对象，则调用该PSO对象的PrintBest方法，打印当前最优解。
 */
void PSOMethod::PrintBest() const 
{
	if (pso_ != nullptr) {
		pso_->PrintBest();
	}
}

/**
 * @brief 获取当前最优位置
 *
 * 获取粒子群优化算法中的当前最优位置
 *
 * @return 返回指向当前最优位置的指针，如果未进行初始化则返回nullptr
 */
double PSOMethod::GetBestValue() const 
{
	if (pso_ != nullptr) {
		return pso_->GetBestValue();
	}
	return -1.0;
}

const double* PSOMethod::GetBestPosition() const 
{
	if (pso_ != nullptr) {
		return pso_->GetBestPosition();
	}
	return nullptr;
}

/**
 * @brief 获取当前最优解的可行性状态
 *
 * 检查当前粒子群优化器中的最优解是否可行，并返回可行性状态。
 *
 * @return 如果当前最优解可行，则返回true；否则返回false。
 */
bool PSOMethod::GetBestFeasibility() const 
{
	if (pso_ != nullptr) {
		return pso_->GetBestFeasibility();
	}
	return false;
}

